home *** CD-ROM | disk | FTP | other *** search
- ⓪ IMPLEMENTATION MODULE Binary; (* V#041 *)⓪ (*$L-,R-*)⓪ (*$Y+*)⓪ ⓪ (*⓪"28.5.88 tt Überflüssiges MOVEQ #0,D2 am Ende v. 'write' entfernt⓪"3.7.88 tt Bei write mit null Bytes wird A3 korrekt abgeräumt;⓪.bei Seek wird auch richtig expandiert, wenn FilePos beim⓪.Aufruf nicht am Fileende ist.⓪"6.5.90 tt Read/WriteLargeBlock neu⓪ *)⓪ ⓪ FROM FileBase IMPORT Unit, UDataProc, UCloseProc, UFlushProc, URStrProc,⓪(UWStrProc, UGChrProc;⓪ ⓪ FROM Files IMPORT File, Access, @CheckState;⓪ ⓪ FROM SYSTEM IMPORT ASSEMBLER, BYTE, WORD, LONGWORD, ADDRESS, ADR;⓪ ⓪ IMPORT MOSGlobals;⓪ ⓪ (*$I FileDesc.Icl *)⓪ ⓪ (*$O+*)⓪ TYPE File = POINTER TO FileDesc;⓪ (*$O-*)⓪ ⓪ ⓪ PROCEDURE ErrHandler;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L A0,(A3)+⓪(JSR @CheckState⓪(TST -(A3)⓪(BEQ e0⓪(CLR File.state(A0)⓪%e0 CLR D0⓪$END⓪"END ErrHandler;⓪ ⓪ PROCEDURE CheckAccess;⓪"BEGIN⓪$ASSEMBLER⓪(TST -(A3)⓪(BEQ rf⓪(CMPI #2,File.accmode(A0)⓪(BLS rt⓪(MOVE #MOSGlobals.fBadOp,File.state(A0)⓪(JMP ErrHandler⓪%rf RTS⓪%rt MOVEQ #1,D0⓪$END⓪"END CheckAccess;⓪ ⓪ ⓪ PROCEDURE FileSize (f: File): LONGCARD;⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(JSR @CheckState⓪(JSR CheckAccess⓪(UNLK A5⓪(BEQ r0⓪(MOVE.L File.len(A0),(A3)+⓪(RTS⓪%r0 CLR.L (A3)+⓪$END⓪"END FileSize;⓪ ⓪ ⓪ PROCEDURE FilePos (f: File): LONGCARD;⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(JSR @CheckState⓪(JSR CheckAccess⓪(UNLK A5⓪(BEQ r0⓪(MOVE.L File.pos(A0),(A3)+⓪(RTS⓪%r0 CLR.L (A3)+⓪$END⓪"END FilePos;⓪ ⓪ ⓪ PROCEDURE write (f:File; start: ADDRESS; len: LONGCARD);⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L -12(A3),(A3)+⓪(JSR @CheckState⓪(TST -(A3)⓪(BEQ err⓪(MOVE File.accmode(A0),D0⓪(BEQ badAcc⓪(CMPI #2,D0⓪(BHI badOp⓪ ⓪(MOVE.L -(A3),D0 ; LEN⓪(BEQ ok0⓪(MOVE.L -(A3),-(A7) ; START⓪(MOVE.L D0,-(A7)⓪(MOVE File.handle(A0),-(A7)⓪(MOVE #$40,-(A7)⓪(TRAP #1⓪(ADDQ.L #4,A7⓪(MOVE.L (A7)+,D1 ; LEN⓪(ADDQ.L #4,A7⓪(MOVE.L -(A3),A0⓪(MOVE #1,File.modified(A0)⓪(TST.L D0⓪(BPL ok⓪(MOVE D0,File.state(A0)⓪(UNLK A5⓪(RTS⓪'ok0:⓪(SUBQ.L #8,A3⓪(UNLK A5⓪(RTS⓪ ⓪'badOp:⓪(MOVE #MOSGlobals.fBadOp,D0⓪(BRA errH⓪'badAcc:⓪(MOVE #MOSGlobals.fBadAccess,D0⓪'errH:⓪(MOVE D0,File.state(A0)⓪(MOVE.L A0,(A3)+⓪(JSR ErrHandler⓪'err:⓪(SUBA.W #12,A3⓪(UNLK A5⓪(RTS⓪ ⓪'full:⓪(MOVE #MOSGlobals.fDiskFull,File.state(A0)⓪(UNLK A5⓪(RTS⓪ ⓪'ok:⓪(CMP.L D0,D1⓪(BHI full⓪(ADD.L D1,File.pos(A0)⓪(MOVE.L File.pos(A0),D0⓪(CMP.L File.len(A0),D0⓪(BCS end⓪(MOVE.L D0,File.len(A0)⓪'end:⓪(UNLK A5⓪$END⓪"END write;⓪ ⓪ PROCEDURE seek0;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.W D3,-(A7)⓪(MOVE.W File.handle(A4),-(A7)⓪(MOVE.L D4,-(A7)⓪(MOVE #$42,-(A7)⓪(TRAP #1⓪(ADDA.W #10,A7⓪$END⓪"END seek0;⓪ ⓪ PROCEDURE Seek (f: File; offset : LONGINT; base: SeekMode);⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(MOVEM.L D3-D5/A4,-(A7)⓪(MOVE.W -(A3),D3 ; base⓪(MOVE.L -(A3),D4 ; offset⓪(JSR @CheckState⓪(JSR CheckAccess⓪(MOVE.L A0,A4 ; f⓪(BEQ.L end⓪(⓪(; r := seek (offset,f^.handle,base);⓪(JSR seek0⓪(TST.L D0⓪(BPL.L noErr⓪(⓪(CMPI.W #-64,D0⓪(BNE.L genErr⓪(TST File.accmode(A4)⓪(BEQ.L genErr⓪(⓪(; Seek ans Ende⓪(MOVE.L D4,D5⓪(SWAP D3⓪(MOVEQ #0,D4⓪(MOVE #fromEnd,D3⓪(JSR seek0⓪(TST.L D0⓪(BMI.L genErr⓪(SWAP D3⓪(MOVE.L D5,D4⓪(⓪(MOVE.L File.len(A4),D5 ; len⓪(CMP.L D5,D0⓪(BNE.L interr ; -> Fehler: len und seek-Pos nicht gleich⓪(⓪(CMPI #1,D3⓪(BEQ frPos⓪(BCS frBeg⓪(ADD.L D5,D4⓪&frPos⓪(ADD.L File.pos(A4),D4⓪&frBeg⓪(⓪(CMP.L D5,D4⓪(BLS noExp⓪(⓪(SUB.L D4,D5⓪(NEG.L D5⓪(⓪%l0 MOVE.L A4,(A3)+⓪(MOVE.L #$8000,(A3)+⓪(CMPI.L #$4000,D5⓪(BLS t2⓪(MOVE.L #$4000,D0⓪(BRA t3⓪%t2 MOVE.L D5,D0⓪%t3 MOVE.L D0,(A3)+⓪(PEA rtnadr(PC)⓪(LINK A5,#0⓪(JMP write⓪%rtnadr:⓪(TST File.state(A4)⓪(BMI end⓪(SUB.L #$4000,D5⓪(BGT l0⓪(⓪(CLR D3 ; base:= fromBegin⓪(JSR seek0⓪(⓪&noExp:⓪(TST.L D0⓪(BPL noErr⓪(⓪&genErr:⓪(MOVE D0,File.state(A4)⓪(BRA end⓪(⓪&interr⓪(MOVE #MOSGlobals.fInternalErr1,D0⓪(BRA genErr⓪(⓪&noErr:⓪(MOVE.L D0,File.pos(A4)⓪(CMP.L File.len(A4),D0⓪(BLS end⓪(MOVE.L D0,File.len(A4)⓪(⓪&end:⓪(MOVEM.L (A7)+,D3-D5/A4⓪(UNLK A5⓪$END⓪"END Seek;⓪ ⓪ ⓪ PROCEDURE read;⓪"BEGIN⓪$ASSEMBLER⓪(MOVEM.L D1/D2/A0,-(A7)⓪(MOVE File.handle(A0),-(A7)⓪(MOVE #$3F,-(A7)⓪(TRAP #1⓪(ADDQ.L #4,A7⓪(MOVEM.L (A7)+,D1/D2/A0 ; len / * / f⓪(TST.L D0⓪(BPL ok⓪(MOVE D0,File.state(A0)⓪(UNLK A5⓪(RTS⓪'ok⓪(ADD.L D1,File.pos(A0)⓪'end⓪(UNLK A5⓪$END⓪"END read;⓪ ⓪ PROCEDURE rd_prep;⓪"BEGIN⓪$ASSEMBLER⓪(MOVE.L D1,D0⓪(ADD.L File.pos(A0),D0⓪(CMP.L File.len(A0),D0⓪(BHI t0⓪(JMP read⓪%t0 MOVE #MOSGlobals.fEndOfFile,File.state(A0)⓪(MOVE.L File.pos(A0),D0⓪(CMP.L File.len(A0),D0⓪(BCS e0⓪(JSR ErrHandler⓪%e0⓪$END⓪"END rd_prep;⓪ ⓪ PROCEDURE ReadByte (f: File; VAR byte: BYTE);⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(MOVE.L -(A3),-(A7)⓪(JSR @CheckState⓪(JSR CheckAccess⓪(BEQ e0⓪(MOVE.L (A7)+,D2 ; start⓪(MOVEQ #1,D1 ; len⓪(JSR rd_prep⓪%e0 UNLK A5⓪$END⓪"END ReadByte;⓪ ⓪ PROCEDURE ReadWord (f: File; VAR word: WORD);⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(MOVE.L -(A3),-(A7)⓪(JSR @CheckState⓪(JSR CheckAccess⓪(BEQ e0⓪(MOVE.L (A7)+,D2 ; start⓪(MOVEQ #2,D1 ; len⓪(JSR rd_prep⓪%e0 UNLK A5⓪$END⓪"END ReadWord;⓪ ⓪ PROCEDURE ReadLong (f: File; VAR long: LONGWORD);⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(MOVE.L -(A3),-(A7)⓪(JSR @CheckState⓪(JSR CheckAccess⓪(BEQ e0⓪(MOVE.L (A7)+,D2 ; start⓪(MOVEQ #4,D1 ; len⓪(JSR rd_prep⓪%e0 UNLK A5⓪$END⓪"END ReadLong;⓪ ⓪ PROCEDURE ReadBlock (f: File; VAR block: ARRAY OF BYTE);⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(MOVE.W -(A3),-(A7)⓪(MOVE.L -(A3),-(A7)⓪(JSR @CheckState⓪(JSR CheckAccess⓪(BEQ e0⓪(MOVE.L (A7)+,D2 ; start⓪(MOVEQ #0,D1⓪(MOVE.W (A7)+,D1 ; HIGH⓪(ADDQ.L #1,D1⓪(JSR rd_prep⓪%e0 UNLK A5⓪$END⓪"END ReadBlock;⓪ ⓪ PROCEDURE ReadLargeBlock (f: File; VAR block: LONGARRAY OF BYTE);⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(MOVE.L -(A3),-(A7)⓪(MOVE.L -(A3),-(A7)⓪(JSR @CheckState⓪(JSR CheckAccess⓪(BEQ e0⓪(MOVE.L (A7)+,D2 ; start⓪(MOVE.L (A7)+,D1 ; HIGH⓪(ADDQ.L #1,D1⓪(JSR rd_prep⓪%e0 UNLK A5⓪$END⓪"END ReadLargeBlock;⓪ ⓪ PROCEDURE ReadBytes ( f : File;⓪9addr : ADDRESS;⓪9bytes : LONGCARD;⓪5VAR bytesRead: LONGCARD);⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(MOVE.L -(A3),-(A7) ; bytesRead⓪(MOVE.L -(A3),-(A7)⓪(MOVE.L -(A3),-(A7)⓪(JSR @CheckState⓪(JSR CheckAccess⓪(BEQ e0⓪(MOVE.L (A7)+,D2 ; addr⓪(MOVE.L (A7)+,D1 ; bytes⓪(MOVE.L (A7)+,A1 ; bytesRead⓪(MOVE.L File.len(A0),D0⓪(SUB.L File.pos(A0),D0⓪(CMP.L D0,D1⓪(BLS t0⓪(MOVE.L D0,D1⓪%t0 MOVE.L D1,(A1)⓪(JMP read⓪%e0 UNLK A5⓪$END⓪"END ReadBytes;⓪ ⓪ ⓪ PROCEDURE WriteByte (f: File; byte: BYTE);⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(MOVE.W -(A3),-(A7)⓪(MOVE.L A7,(A3)+⓪(MOVEQ #1,D0⓪(MOVE.L D0,(A3)+⓪(JMP write⓪$END⓪"END WriteByte;⓪ ⓪ PROCEDURE WriteWord (f: File; word: WORD);⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(MOVE.W -(A3),-(A7)⓪(MOVE.L A7,(A3)+⓪(MOVEQ #2,D0⓪(MOVE.L D0,(A3)+⓪(JMP write⓪$END⓪"END WriteWord;⓪ ⓪ PROCEDURE WriteLong (f: File; long: LONGWORD);⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(MOVE.L -(A3),-(A7)⓪(MOVE.L A7,(A3)+⓪(MOVEQ #4,D0⓪(MOVE.L D0,(A3)+⓪(JMP write⓪$END⓪"END WriteLong;⓪ ⓪ PROCEDURE WriteBlock (f: File; REF block: ARRAY OF BYTE);⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(MOVEQ #0,D0⓪(MOVE.W -(A3),D0⓪(ADDQ.L #1,D0⓪(MOVE.L D0,(A3)+⓪(JMP write⓪$END⓪"END WriteBlock;⓪ ⓪ PROCEDURE WriteLargeBlock (f: File; REF block: LONGARRAY OF BYTE);⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(ADDQ.L #1,-4(A3)⓪(JMP write⓪$END⓪"END WriteLargeBlock;⓪ ⓪ PROCEDURE WriteBytes (f: File; addr: ADDRESS; bytes: LONGCARD);⓪"BEGIN⓪$ASSEMBLER⓪(LINK A5,#0⓪(JMP write⓪$END⓪"END WriteBytes;⓪ ⓪ END Binary.⓪ ə
- (* $00001B3D$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$000002CB$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDA$FFFD5CDAÇ$00000259T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00001FA8$00000A99$000020C8$FFF0C822$FFF0C822$00000838$00000259$FFED095D$00000BB8$0000146B$0000158B$000016AF$000017DA$000018DE$00001A3C$00002052£Çâ*)
-